#include <stdio.h>
#include <stdlib.h>
#include "Status.c"
#define MAXLENGTH 50

/**
 * 栈 
 * 1、定义          只能再表的一端（栈顶）进行插入和删除运算的线性表
 * 2、逻辑结构       与线性表相同，一对一关系
 * 3、存储结构       用顺序栈或链栈存储均可，但以顺序栈更常见
 * 4、运算规则       只能再栈顶运算，且访问节点时依照后进先出（LIFO）或者先进后出（FILO）的原则
 * 5、主要操作       入栈、出栈、读取栈顶元素、建栈、判断栈满、栈空等
 */

typedef struct {
    char *base;
    char *top;
    int stackSize;
}SqStack;

Status initStack(SqStack *s) {

    s->base = (char *)malloc(sizeof(char)*100); 
    // for (int i = 0; i < MAXLENGTH; i++)
    // {
    //     s->base = (char *)malloc(sizeof(char)*100); 
    //     if (!s->base[i])
    //     {
    //         return OVERFLOW;
    //     }
           
    // }
    s->top = s->base;
    
    s->stackSize = MAXLENGTH;

    return OK;
}

// 判空
int stackEmpty(SqStack s) {
    return s.base == s.top;
}

// 长度
int stackLength(SqStack s) {
    return s.top - s.base;
}

// 清空
Status clearStack(SqStack *s) {
    s->top = s->base;
    return OK;
}

// 入栈
Status push(SqStack *s, char *a) {
    // 栈满
    if (s->top-s->base == s->stackSize)
    {
        return ERROR;
    }
    *(s->top) = *a;
    s->top++;
    return OK;
}

// 出栈
Status pop(SqStack *s, char *a) {
    // 栈空
    if (s->top == s->base)
    {
        return ERROR;
    }
    *a = *(--s->top);
    return OK;
}

// 取顶元素
Status getTop(SqStack *s, char *a) {
    // 栈空
    if (s->top == s->base)
    {
        return ERROR;
    }
    *a = *(s->top-1);
    return OK;
}


int main() {
    // 建栈
    SqStack s;
    Status sr = initStack(&s);
    printf("%d\n",sr);
    char a = 'a';
    char b = 'b';
    // 入栈
    push(&s,&a);
    push(&s,&b);
    // 读取栈顶元素
    char c;
    getTop(&s,&c);
    printf("c=%c\n",c);
    // 出栈
    char d;
    pop(&s,&d);
    printf("d=%c\n",d);
    getTop(&s,&c);
    printf("c=%c\n",c);
    // 判断栈空
    return 0;
}